Planteamiento del problema

Determinar si el nivel del CDS de un país tiene poder predictivo sobre la calificación del soberano de ese país. El problema se puede plantear desde varios puntos de vista.

Datos

Definimos \(X_i(t)\) el valor del CDS del paĆ­s \(i\) en el tiempo \(t\).

# carga el objeto data:
load("rvbasederatingsycds/Base_Histórico_RC.Rda")
head(data)
       Fecha       Country Rating      CDS Rating_Num
1 2010-09-13 Corea del Sur      A 105.9430         17
2 2012-12-26    Eslovaquia      A 100.7669         17
3 2010-08-12 Corea del Sur      A 109.6306         17
4 2010-09-12 Corea del Sur      A 104.3209         17
5 2012-04-17    Eslovaquia      A 238.8106         17
6 2011-07-27        Israel      A 140.9389         17
ratings <- c("CCC-","CCC","CCC+","CC","BBB-","BBB","BBB+","BB-","BB","BB+","B-","B","B+","A-","A","A+","AA-","AA","AA+","AAA")

# Categorización de los ratings:
datos <- data %>%
         mutate(fecha = as.Date(Fecha, format = "%Y-%m-%d"),
                semana = week(fecha),
                aƱo = year(fecha),
                Rating = factor(Rating,ordered = T,levels = ratings),
                Country = factor(Country),
                Rating_simple = fct_relevel(
                                    fct_collapse(Rating,
                                                 "AAA" = c("AAA"),
                                                 "AA"  = c("AA","AA+","AA-"),
                                                 "A"   = c("A","A-","A+"),
                                                 "BBB" = c("BBB","BBB-","BBB+"),
                                                 "BB"  = c("BB","BB-","BB+"),
                                                 "B"   = c("B","B+","B-"),
                                                 "CCC" = c("CC","CCC","CCC-","CCC+")),
                                    c("AAA","AA","A","BBB","BB","B","CCC")),
                logCDS = log(1+ CDS)) %>% 
         group_by(Country) %>%
         arrange(Country, fecha) %>%
         dplyr::select(- Fecha)

Los números de observaciones que cae en cada rating (ignorando de qué país vienen son los siguientes:

# Originales
fct_count(datos$Rating)
# A tibble: 20 x 2
   f         n
   <ord> <int>
 1 CCC-    103
 2 CCC     486
 3 CCC+   1022
 4 CC      379
 5 BBB-  15294
 6 BBB   13863
 7 BBB+   8918
 8 BB-    8942
 9 BB    12314
10 BB+   10778
11 B-     9425
12 B      5308
13 B+    10767
14 A-     7335
15 A      3832
16 A+     9333
17 AA-    9212
18 AA    11176
19 AA+    5193
20 AAA   20453
# Colapsados
fct_count(datos$Rating_simple)
# A tibble: 7 x 2
  f         n
  <ord> <int>
1 AAA   20453
2 AA    25581
3 A     20500
4 BBB   38075
5 BB    32034
6 B     25500
7 CCC    1990
# convierte a escala logaritmica para simplificar

paises <- levels(datos$Country) #lista de paĆ­ses en la muestra
npaises <- length(paises)
#str(datos)

Vistos como series temporales y algunos ejemplos de las series con los ratings originales:

p <- paises[6]

datos %>% filter(Country == p) %>%
          ggplot(aes(x = fecha, y = logCDS, color = Rating, group=1)) + 
          geom_path() + 
          labs(title = p)

datos %>% ggplot(aes(x = fecha, y = logCDS, color = interaction(Country, Rating_simple), group = Country)) + 
          geom_line() +
          theme(legend.position = "none")

Considera las distribuciones condicionales en cada tiempo \(t\).

anuales <- 2010:2019

for(y in anuales){
    datosmex <- datos %>%
                filter(Country == "MƩxico", aƱo == y, semana %in% 1:52) %>%
                group_by(Rating_simple)


p <- datos %>% 
    filter(aƱo == y, semana %in% 1:52) %>%
    group_by(Rating_simple) %>%
    ggplot(aes(x = Rating_simple, y = logCDS)) + 
        geom_boxplot(aes(y = logCDS,color = Rating_simple)) + 
        geom_violin(data = datosmex,aes(x = Rating_simple, y = logCDS),
                    color = "red", alpha = 0.2,draw_quantiles = 0.5) +
        facet_wrap(~ semana,nrow = 4) +
        labs(title = paste("AƱo:",y))
        theme(legend.position = "none", text = element_text(size=10))

 print(p)
}              

Se calcula el p-value de la prueba estadística de que la calificación de México pertenezca a un cierto rating en una fecha dada (agrupando por meses), a través de una prueba de permutación (no paramétrica), comparando las observaciones de México y las de la distribución de observaciones que pertenecen a cada categoría en esa fecha dada.

rating <- "BB"
datossem <- datos %>%
            na.omit() %>%
            filter(aƱo == 2010, semana == 1, Rating_simple == rating) %>%
            group_by(Rating_simple) %>%
            dplyr::select(fecha, aƱo, semana, Rating_simple,logCDS) %>%
            (function(x)x$logCDS)
            

mexico      <- datos %>% 
               filter(aƱo == 2010, semana == 1, Country == "MƩxico") %>%
               dplyr::select(Country,logCDS) %>%
               (function(x)x$logCDS)
               #%>%
               #summarise(mediana = median(logCDS,na.rm = T)) %>% 
               #(function(x)x$mediana)

prueba.permutacion <- function(x,y,L = 3000){
  delta <- NULL
  n1 <- length(x)
  n2 <- length(y)
  stat <- median(x)-median(y)
  for(i in 1:L){
    permutacion <- sample(c(x,y),size = n1+n2)
    delta[i] <- median(permutacion[1:n1]) - median(permutacion[(n1+1):(n1+n2)])
  }
  pval <- sum(abs(delta)>abs(stat))/L
  return(pval)
}

CƔlculo de p-values:

calificaciones  <- c("AAA","AA","A","BBB","BB","B","CCC")
A <- data.frame()
k <- 0
for(calif in calificaciones){
  for (a in anuales){
    for (s in 1:52){
         k <- k + 1
         datossem <- datos %>%
                  na.omit() %>%
                  filter(aƱo == a, semana == s, Rating_simple == calif) %>%
                  group_by(Rating_simple) %>%
                  dplyr::select(fecha, aƱo, semana, Rating_simple, logCDS) %>%
                  (function(x)x$logCDS)
            

          mexico  <- datos %>% 
                     filter(aƱo == a, semana == s, Country == "MƩxico") %>%
                     dplyr::select(Country,logCDS) %>%
                     (function(x)x$logCDS)
          
          pval <- prueba.permutacion(datossem,mexico,L=3000)
            
          A <- rbind(A,data.frame(rating = calif, 
                                        aƱo = a,
                                        semana = s,
                                        pvalue = pval))
          #print(c(a,s,calif,pval))

    }
  }
}  

A %>% ggplot(aes(x=aƱo+semana/52, y=pvalue, color=rating)) + 
      geom_path() +
      geom_point() +
      geom_hline(yintercept = 0.05, color = "red") +
      labs(title = "p-values de pertenecer a cierta calificación",subtitle = "datos agregados semanalmente")